﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

//int main()
//{
//	printf("%d\n", 15);
//	printf("%d\n", 0xF);
//	printf("%d\n", 017);
//	return 0;
//}

//int Add(int x, int y)
//{
//	int ret = 0;
//	ret = x + y;
//	return ret;
//}
//
//int main()
//{
//	int a = 10;
//	int b = 20;
//	int c = 0;
//	c = Add(a, b);
//	printf("%d", c);
//	return 0;
//}

//正整数左移
//int main()
//{
//	int n = 12;
//	int m = n << 2;   /48
//	printf("%d",m);
//	return 0;
//}
//负整数左移
//int main()
//{
//	int n = -12;
//	int m = n << 2;   //-48
//	printf("%d", m);
//	return 0;
//}

////正整数右移  (采用算术右移，左边补原来的符号)
//int main()
//{
//	int n = 12;
//	int m = n >> 2;   //3
//	printf("%d", m);
//	return 0;
//}

//负整数右移  (采用算术右移，左边补原来的符号)
//int main()
//{
//	int n = -12;
//	int m = n >> 2;   //-3
//	printf("%d", m);
//	return 0;
//}


//对于移位运算符，不要移动负数位，这个是标准未定义的
//int main()
//{
//	int n = 10;
//	int m = n >> -1;  //error
//	printf("%d", m);
//	return 0;
//}

// &: 按位与   (对应二进制位相与，有0则0，两个同时为1才为1)
// |:按位或    (对应二进制位相或，有1则1，两个同时位0才为0)
// ^: 按位异或 (对应二进制位相异或，相同为0，相异为1)
// ~：按位取反 (对应二进制位按位取反) 
//注：他们的操作数必须是整数。
//int main()
//{
//	int a = 0;
//	//00000000000000000000000000000000  0的补码
//	//11111111111111111111111111111111  按位取反 
//	//10000000000000000000000000000001  变成原码 -1
//	printf("%d", ~a);
//	return 0;
//}】


//不能创建临时变量（第三个变量），实现两个整数的交换。

//方法一  (可能会存在溢出)
//int main()
//{
//	int a = 10;
//	int b = 20;
//	printf("交换前 a=%d b=%d\n", a, b);
//
//	a = a + b;
//	b = a - b;
//	a = a - b;
//
//	printf("交换前 a=%d b=%d\n", a, b);
//
//	return 0;
//}

//方法二
//a^a=0  a^0=a;
//int main()
//{
//	int a = 10;
//	int b = 20;
//	printf("交换前 a=%d b=%d\n", a, b);
//
//	a = a ^ b;
//	b = a ^ b;
//	a = a ^ b;
//
//	printf("交换前 a=%d b=%d\n", a, b);
//
//	return 0;
//}

//编写代码实现：求⼀个整数存储在内存中的⼆进制中1的个数。
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int count = 0;
//	int i = 0;
//	for (i = 0; i < 32; i++)
//	{
//		if (((n >> i) & 1) == 1)
//			count++;
//	}
//	printf("%d", count);
//	return 0;
//}

//更加巧妙的方法
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int count = 0;
//	while (n)
//	{
//		n = n & (n - 1);
//		count++;
//	}
//	printf("%d", count);
//	return 0;
//}

//写一个代码，判断是不是2的次方数
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	if ((n & (n - 1)) == 0)
//		printf("yes");
//	else
//		printf("no");
//	return 0;
//}


//⼆进制位置0或者置1
//编写代码将13⼆进制序列的第5位修改为1，然后再改回0

//int main()
//{
//	int n = 13;
//	//将13⼆进制序列的第5位修改为1
//	//00000000000000001101  补码
//	//00000000000000010000  将1左移4位
//	//00000000000000011101  按位或
//	n = n | (1 << (5 - 1));
//	printf("%d\n", n);
//	//然后再改回0
//	//00000000000000011101  补码
//	//11111111111111101111  将1左移4位再按位取反
//	//00000000000000001101  按位与
//	n = n & (~(1 << (5 - 1)));
//	printf("%d\n", n);
//	return 0;
//}

//int main()
//{
//	int a = 2;
//	int b = 3;
//	printf("%d", a < b); //结果为1
//	return 0;
//}

//struct  Stu
//{
//	char name[20]; //姓名
//	float height;  //身高
//	int age;       //年龄
//};
//int main()
//{
//	struct Stu s1 = {"皮皮",180.5f,20};  //局部变量
//	struct Stu s2 = { .age = 22,.name = "张山",.height = 199.22f };
//	struct Stu s3;
//	s3.age = 12;
//	s3.height = 116.4f;
//	
//	printf("%s", s2.name);
//	return 0;
//}
